//
// Created by huangjunhao on 2022/9/27.
//
#pragma once

#ifndef KEBEN_SLIST_H
#define KEBEN_SLIST_H

#endif //KEBEN_SLIST_H
#pragma once

#include<stdio.h>
#include <stdlib.h>
#include <assert.h>


/**\
 *  Singly Linked List  : 简写 SList
 */
typedef int SListDataType;
//节点
typedef struct SListNode
{
    SListDataType data;  //单链表数据 当前设定的类型是int
    struct SListNode* next;
}SListNode;

//根据需求可以改的扩展，
struct SList{
    SListNode* head; //头节点
    SListNode* tail; //尾节点
    size_t len; //记录链表长度   找出单链表中间节点等需求可能用到
};

SListNode * slCreate(SListNode* ps);
SListNode *LinkListTailCreate(SListNode *pNode);
SListNode * slInit(SListNode* ps);
//尾插 头插 根据索引位置插入
void SListPushBack(SListNode** phead,SListDataType x);
void SListPushFront(SListNode** phead,SListDataType x);
void SListPushByIndex(SListNode *pphead, SListDataType x,int index);
// 头删 尾删 按索引删
//void SListPopBack(SListNode** phead);
void SListPopBack(SListNode** pphead,int index);
void SListPopFront(SListNode** phead);
//链表长度
int SListSize(SListNode* phead);
//链表打印
void SListPrint(SListNode* phead);
//动态申请一个节点
SListNode* BuySListNode(SListDataType x);
//在给定pos位置之后插入x
void SListInsetAfter(SListNode* pos,SListDataType x);
//根据索引查找
SListNode* SListFind(SListNode* phead,unsigned int index);
//逆置链表 要求空间复杂度1
SListNode* reverseList(struct SListNode* head);
